#include <bits/stdc++.h>
using namespace std;
using ll=long long;
// int main()
// {
//     int m;cin>>m;
//     while(m--)
//     {
//         ll a,b;cin>>a>>b;
//         ll x=a*b;
//         if(x==1)
//         {
//             cout<<"NO"<<endl;
//             continue;
//         }
//         bool is1=true,is2=true,is3=true;
//         for(ll i=2;i<=sqrt(a);i++)
//         {
//             if(a%i==0)
//             {
//                 is1=false;break;
//             }
//         }
//         for(ll i=2;i<=sqrt(b);i++)
//         {
//             if(b%i==0)
//             {
//                 is2=false;break;
//             }
//         }
//         for(ll i=2;i<=sqrt(x);i++)
//         {
//             if(x%i==0)
//             {
//                 is3=false;break;
//             }
//         }
//         if(a==1&&is2==true||b==1&&is1==true)cout<<"YES"<<endl;
//         else cout<<"NO"<<endl;
//     }
//     return 0;
// }

// int main()
// {
//     int n,k;cin>>n>>k;
//     vector<int> ret(n);
//     for(int i=0;i<n;i++)cin>>ret[i];
//     sort(ret.begin(),ret.end());
//     int maxlen=0;
//     for(int left=0,right=0;right<n;)
//     {
//         while(right<n&&abs(ret[right]-ret[left])<=k)right++;
//         maxlen=max(maxlen,right-left);
//         int x=lower_bound(ret.begin(), ret.begin()+right, ret[right]-k)-ret.begin();
//         left=x;
//     }
//     cout<<maxlen<<endl;
//     return 0;
// }

//dp[i][j]表示s1的前i个字符和s2的前j的字符的最长公共子序列长度
int main()
{
    int x,y;cin>>x>>y;
    string s1,s2;cin>>s1>>s2;
    vector<vector<int>> dp(x+1,vector<int>(y+1,0));
    for(int i=1;i<=x;i++)
    {
        for(int j=1;j<=y;j++)
        {
            if(s1[i-1]==s2[j-1])
            {
                dp[i][j]=dp[i-1][j-1]+1;
            }
            else
            {
                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
    }
    cout<<dp[x][y]<<endl;
    return 0;
}